O arquivo Matter2013-London.csv, obtido em www.airqualityontario.com, contém informações sobre as concentrações de partículas inaláveis finas (MP\(_{2,5}\), em \(\mu g/m^{3}\) ), registradas no ano de 2013 em London, cidade situada na província canadense de Ontário. Os valores são registrados a cada hora. Para determinado dia D, as variáveis \(\textit{H}_{1}\) a \(\textit{H}_{24}\) representam as medições feitas na primeira até a \(24^{ª}\) hora do dia, respectivamente.
O objetivo desta análise é fazer uma análise exploratória desta série temporal dada por:
\[Y_{t} = min\{H_{j,t}\}\]
Dados brutos antes do tratamento:
# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)
matter.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/Matter2013-London.csv"
matter <- read_csv(matter.loc)
head(matter)
Dados após preparação:
# ----- data preparation
# passando para formato long;
# eliminando as duas primeiras colunas;
# eliminando os NA's e as entradas com 9999 e -999;
# agrupando por dia e calculando o minimo
matter2 <- matter %>%
dplyr::select(-(1:2)) %>% # eliminando duas primeiras colunas
melt(id.vars = "Date") %>% # to long
magrittr::set_colnames(c("Date", "hora", "MP")) %>%
dplyr::arrange(Date, hora) %>% # ordenar por dia/hora
mutate(MP = replace(MP, MP == 9999 | MP == -999, NA)) %>% # sol: https://stackoverflow.com/questions/35610437/using-dplyr-to-conditionally-replace-values-in-a-column
na.omit() %>%
group_by(Date) %>%
summarise(MP = as.numeric(min(MP, na.rm=TRUE))) # a serie eh baseada no minimo do dia
# nao precisamos das horas
# passando para tibble e tibbletime:
matter3 <- matter2 %>%
#tibble::as_tibble() %>%
#na.omit() %>% # eliminando os NA's
mutate(Date = lubridate::ymd(Date)) %>% # usando ymd do lubridate
as_tbl_time(index = Date)
head(matter3)
Gráficos da série temporal \(Y_{t}\):
# ----- plots serie:
# --- serie:
# ggplot:
# matter3 %>%
# ggplot() +
# geom_line(aes(x = Date, y = MP), colour="orange") +
# theme_minimal()+
# labs(title="Série diária de MP")
# dygraphs
library(dygraphs)
library(xts)
matter3_ts <- xts(matter3 %>% dplyr::select(MP), order.by=matter3$Date)
# dygraph(matter3_ts, elementId='matter3') %>% dyRangeSelector()# %>% dyUnzoom()
dygraph(matter3_ts, elementId='matter3', main="Série diária da variável MP" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
dySeries("MP", color = "orange")
# rCharts:
# library(rCharts)
# library(rjson)
# dPlot(MP ~ Date, data = matter3, type="line")
Plots da ACF e PACF para analisar estacionariedade:
# ----- plots:
par(mfrow=c(1,2))
acf(matter3_ts)
pacf(matter3_ts)
Com base no gráfico da Função de Autocorrelação (FAC ou ACF em inglês), é possível inferir que a série é estacionária. Há um decaimento rápido da autocorrelação nos primeiros lags e, mesmo com uma certa variabilidade neste padrão, a correlação parece tender rapidamente a zero conforme \(h\) aumenta. Este comportamento indica a presença de estacionariedade na série. Se houvesse um decaimento lento da FAC, isto poderia indicar o efeito de uma memória de mais longo prazo nos dados. Consequentemente, teríamos a dependência persistente (entre os valores de \(Y_{t}\)) ao longo do tempo e a não-estacionariedade da série, o que não é o caso.
Haveria, ainda, a possibilidade de empregarmos testes estatísticos para a existência de estacionariedade na série. Uma das possibilidades seria o teste de Dick-Fuller (mais especificamente Augmented Dick-Fuller Test (ADF)), o qual realizamos abaixo:
# Augmented Dick-Fuller Test for Stationarity
tseries::adf.test(matter3_ts, alternative="stationary")
##
## Augmented Dickey-Fuller Test
##
## data: matter3_ts
## Dickey-Fuller = -6.3473, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
Portanto, com um p-valor abaixo de \(1\%\), o resultado nos permite afirmar que há evidências para se aceitar a hipótese de que a série é estacionária, considerando um nivel \(\alpha\) de \(5\%\) para o teste.
Com base na análise descritiva apresentada no item i), o decaimento geométrico nos primeiros lags da FAC, associado ao decaimento abrupto da FACP sugere a assinatura de um modelo Autoregressivo \(A.R.(p)\). Neste caso, para identificar a ordem deste modelo, podemos olhar para o gráfico da Função de Autocorrelação Parcial (FACP ou PACF em inglês). Este gráfico apresenta spike significante (ordenado) apenas para \(h = 1\). Por isso, o modelo de filtro linear adequado para o processo em questão seria um Modelo Autoregressivo de Ordem Um (\(A.R.(1)\)):
\[ Y_{t} = \mu_{0} + \rho Y_{t-1} + \epsilon_{t}\]
O potencial Hidrogeniônico (pH) é uma variável importante no monitoramento da qualidade da água, uma vez que ele afeta o metabolismo de várias espécies aquáticas. De um modo geral, para a proteção da vida aquática, o pH deve estar entre 6 e 9. Tomou-se o conjunto de dados Potencial Hidrogeniônico (pH), obtido junto ao Departamento de Recursos Hídricos do Estado da California, EUA. A série histórica é constituída por 72.570 observações registradas a cada 15 minutos, de 9/mar/2012 a 9/jun/2014.
O objetivo desta análise é fazer uma análise exploratória desta série temporal dada por \(X_{t}\) no intraday.
Dados brutos antes do tratamento:
# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)
ph2012.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2012.CSV"
ph2013.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2013.CSV"
ph2014.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2014.CSV"
ph2012 <- read_csv(ph2012.loc)
ph2013 <- read_csv(ph2013.loc)
ph2014 <- read_csv(ph2014.loc)
# juntando
ph <- bind_rows(ph2012, ph2013, ph2014)
head(ph)
Dados após tratamento:
# data preparation
# convertendo para tibble time (serie temporal)
# library(lubridate)
ph2 <- ph %>%
mutate(Date = lubridate::mdy_hm(Date)) %>% # usando mdy_hm do lubridate
as_tbl_time(index = Date)
# filtrando
# # nao precisa - vamos usar toda a serie
# ph2 <- ph %>%
# filter_time('start' ~ 'end')
head(ph2)
Plots da série temporal \(X_{t}\):
# ----- plots serie:
# --- serie:
ph2 %>%
ggplot(aes(x = Date, y = Point, colour="coral2")) +
geom_line() +
theme_minimal()+
labs(title="Série intraday (15 minutos) da variável Point")
# dygraphs
library(dygraphs)
library(xts)
ph2_ts <- xts(ph2 %>% dplyr::select(Point), order.by=ph2$Date)
# dygraph(matter3_ts, elementId='matter3') %>% dyRangeSelector()# %>% dyUnzoom()
dygraph(ph2_ts, elementId='ph2', main="Série diária da variável MP" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
dySeries("Point", color = "orange")
# rCharts:
# library(rCharts)
# library(rjson)
# dPlot(MP ~ Date, data = matter3, type="line")
Não parece haver comportamento cíclico, mas utilizar um período de minutos para a série, parece tornar o gráfico muito denso, dificultando a “leitura” do gráfico. Então, vamos transformar para uma periodicidade horária:
# ----- plots serie:
# --- serie:
ph2 %>%
as_period("1 h") %>% # haverah uma linha para cada hora
ggplot(aes(x = Date, y = Point)) +
geom_line(colour="coral2") +
theme_minimal()+
labs(title="Série intraday da variável Point")
Periodicidade diária:
ph2 %>%
as_period("1 day") %>%
ggplot(aes(x = Date, y = Point)) +
geom_line(colour="red") +
labs(title="Série diária")
Periodicidade semanal:
ph2 %>%
as_period("1 week") %>%
ggplot(aes(x = Date, y = Point)) +
geom_line(colour="green") +
labs(title="Série semanal")
Periodicidade mensal:
ph2 %>%
as_period("1 m") %>%
ggplot(aes(x = Date, y = Point)) +
geom_line(colour="purple") +
labs(title="Série mensal")